package com.mycode.mediator18;

import com.mycode.mediator18.resolve.ConcreteMediator;
import com.mycode.mediator18.resolve.Button;
import com.mycode.mediator18.resolve.ComboBox;
import com.mycode.mediator18.resolve.List;
import com.mycode.mediator18.resolve.TextBox;

/**
 * 中介者模式：用一个中介对象（中介者）来封装一系列的对象交互，中介者使各对象不需要显式地相互引用，从而使其耦合松散，而且可以独立地改变它们之间的交互
 *            当一个系统中对象之间存在多对多的相关关系，可以将对象之间的一些交互行为从各个对象中分离出来，并集中封装在一个中介者对象中
 * 中介者模式核心：
 *     1、中转作用（结构性）：通过中介者提供的中转作用，各个同事对象就不再需要显式地引用其他同事
 *     2、协调作用（行为性）：中介者可以更进一步地对同事之间的关系进行封装，同事可以一致地和中介者进行交互，而不需要指明中介者需要具体怎么做，将同事成员之间的关系行为进行分离和封装
 *
 * 主要优点：
 *     1、中介者模式简化了对象之间的交互，它用中介者和同事的一对多交互代替了原来的同事之间的多对多交互，一对多关系更容易理解、维护和扩展，将原来的网状结构转换成星型结构
 *     2、中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合，可以独立地改变和复用每一个同事和中介者
 *     3、可以减少大量同事子类生成，中介者将原本分布于多个对象间的行为集中在一起，改变这些行为只需要生成新的中介者子类即可
 * 主要缺点：
 *     1、在具体中介者类中包含了大量同事之间的交互细节，可能会导致具体中介者非常复杂，使得系统难以维护
 * 适用场景：
 *     1、系统中对象之间存在复杂的引用关系，系统结构混乱且难以理解
 *     2、一个对象由于引用了其他很多对象并i企鹅直接和这些对象通信，导致难以复用该对象
 *     3、想通过一个中间类来封装多个类中的行为，而又不想生成太多的子类。中介者中定义对象交互的公共行为，如果需要改变行为则可以增加新的具体中介者
 *
 */
public class Bootstrap {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        // 定义同事对象
        Button button = new Button();
        List list = new List();
        ComboBox comboBox = new ComboBox();
        TextBox textBox = new TextBox();

        button.setMediator(mediator);
        list.setMediator(mediator);
        comboBox.setMediator(mediator);
        textBox.setMediator(mediator);

        mediator.addButton = button;
        mediator.list = list;
        mediator.comboBox = comboBox;
        mediator.userNameTextBox = textBox;

        button.changed();
        System.out.println("------------------------------------");
        list.changed();

    }
}
